import pandas as pd
import random
import matplotlib.pyplot as plt
import numpy as np 
from filter import Filter
from datetime import datetime
from sklearn.preprocessing import Normalizer #归一化函数
from standardize import z_score_standardize
from plot import plot_sensor_time_series
from TrainAlgorithm_BP import BP_analysis

from TrainAlgorithm_LSTM import LSTM_analysis

# 2025年9月8日 星期一 杜经理给了7.22-8.31日数据。调整数据宽度，
# 用7月数据做训练，8月数据做测试：测试曲线分为2个，8月现有投加量，模型预测出的投加量；

# 获取当前本地时间（日期+时间）
current_time = datetime.now()
# 格式化为易读的字符串（默认格式：%Y-%m-%d %H:%M:%S）
formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
print("当前本地时间:", formatted_time)


# 1. 读取数据#######################
df1 = pd.read_excel("D:/lxh/北控水务202507/02 事务处理/PAC投加工艺优化/03 数据/data/7月药水1~12.xlsx")
df2 = pd.read_excel("D:/lxh/北控水务202507/02 事务处理/PAC投加工艺优化/03 数据/data/7月药水12~22.xlsx")
df3 = pd.read_excel("D:/lxh/北控水务202507/02 事务处理/PAC投加工艺优化/03 数据/data/7月药水 22~31.xlsx")
df4 = pd.read_excel("D:/lxh/北控水务202507/02 事务处理/PAC投加工艺优化/03 数据/data/2025 08 01.xlsx")

# 合并df1~df3
df = pd.concat([df1, df2, df3],axis=0)
train_numpydata = df.to_numpy()
# 暂时放下电位仪数据


# ######################################四个沉淀池分别训练模型 subside######################################
# 2. 数据预处理##
# # 调用中值滤波函数滤除异常值

# 1#沉淀池模型

#一期进水浊度
# 中值滤波（去脉冲） → 滑动平均（去高频噪声） → 限幅滤波（防漂移）
# org_Tur_filterData_Median = Filter(train_numpydata[:,2]).median_filter(train_numpydata[:,2],window_size=10) 
# 滑动平均
# org_Tur_filterData_MedianMoveing = Filter(org_Tur_filterData_Median).adaptive_moving_average(org_Tur_filterData_Median,window_size=10)
# 卡尔曼滤波处理
org_Tur_filterData = Filter(train_numpydata[:,2]).kalman_filter(train_numpydata[:,2],process_noise=0.1,measurement_noise=1.0)
"""
# ##################################################################
# 新建表格，存入滤波后的数据观察
# df_Tur_filterData = pd.DataFrame(org_Tur_filterData,columns=['Tur_filterData'])
# df.to_excel('single_row_table.xlsx', index=False,engine='openpyxl')
# ##################################################################
"""
#1号沉淀池出水浊度
Out_Tur_filterData = Filter(train_numpydata[:,5]).kalman_filter(train_numpydata[:,5],process_noise=0.1,measurement_noise=1.0)
# # pac投加流量：现投加量为一期总量，理论上为1/2
PAC_Flow_filterData = Filter(train_numpydata[:,9]).kalman_filter(train_numpydata[:,9],process_noise=0.1,measurement_noise=1.0) / 2
# PAC_Flow_filterData_Median = Filter(train_numpydata[:,9]).median_filter(train_numpydata[:,9],window_size=10) / 2
# PAC_Flow_filterData_MedianMoveing = Filter(PAC_Flow_filterData_Median).adaptive_moving_average(PAC_Flow_filterData_Median,window_size=10)

# # 原水流量
org_Flow_filterData = Filter(train_numpydata[:,12]).kalman_filter(train_numpydata[:,12],process_noise=0.1,measurement_noise=1.0)
# # 投加比例
PotentialData_filterData = train_numpydata[:,14]
PAC_Num_filterData = 1000 * PAC_Flow_filterData * 1.23 / (PotentialData_filterData + 1) / org_Flow_filterData #单耗
# 单耗=流量*密度*药水比/水量
# 1.23-1.5

# 数据对齐

# 对数据进行归一化处理
# train_numpydata = df3.to_numpy()
# org_Tur_filterData =z_score_standardize(org_Tur_filterData)
# Out_Tur_filterData = z_score_standardize(Out_Tur_filterData)
# org_Flow_filterData = z_score_standardize(org_Flow_filterData)#原水流量不单独计入
# PAC_Num_filterData = z_score_standardize(PAC_Num_filterData)
# 4. 预测结果
# 4.1 调用BP神经网络进行训练
# data = pd.DataFrame({'进水浊度(NTU)': org_Tur_filterData,
#                       #'进水流量': org_Flow_filterData,
#                      '出水浊度(NTU)':Out_Tur_filterData,
#                     'PAC单耗(mg/L)':PAC_Num_filterData})
# BP_analysis(data)

# 4.2 使用LSTM进行训练
data2 = pd.DataFrame({'时间': train_numpydata[:,0],
                    '进水浊度': org_Tur_filterData,
                      #'进水流量': org_Flow_filterData,
                     '出水浊度':Out_Tur_filterData,
                    'PAC单耗':PAC_Num_filterData})
# LSTM_analysis(data2)

# 以列表的形式，组合需要画图的数据
train_numpydata_plot = [org_Tur_filterData,# 一期进水浊度滤波数据 Tur
                        Out_Tur_filterData,# 1#沉淀池出水浊度滤波数据 Tur
                        #org_Flow_filterData,# 原水流量滤波数据 m3/h
                        PAC_Num_filterData]# PAC单耗

# 5. 结果可视化
ylabels = ['一期进水浊度 (Tur)','1#沉淀池出水浊度(Tur)','投加量(L/H)','进水量(m3/h)']
fig = plot_sensor_time_series(
    x=train_numpydata[:,0],
    y=train_numpydata_plot,  # 单组数据（列表包裹）
    title="1号沉淀池模型训练数据集",
    xlabel="日期",
    ylabel="数据集",
    labels=['org_Tur','Out_Tur','PAC_Num'],
    colors=['blue','red','green'],
    date_format="%Y-%m-%d %H:%M:%S",  # 仅显示日期（无时间）
    grid=True
)
plt.show()

